const Controller = require('egg').Controller;

class HttpController extends Controller {

  async get() {

    const url = 'https://httpbin.org/get?foo=bar';
    const result = await this.ctx.curl(url, {
      dataType: 'json',

      // 简单登录授权（Basic Authentication）参数，将以明文方式将登录信息以 Authorization 请求头发送出去。
      auth: 'foo:bar',

      // 在请求正式发送之前，会尝试调用 beforeRequest 钩子，允许我们在这里对请求参数做最后一次修改。
      // beforeRequest: Function(options),
      beforeRequest: options => {
        // 例如 设置全局请求 id，方便日志跟踪
        options.headers['x-mate-id'] = 222;
      },
    });
    this.ctx.body = result;
  }

  async post() {
    const url = 'https://httpbin.org/post';
    const result = await this.ctx.curl(url, {
      // 必须指定 method
      method: 'POST',
      // 不设置 contentType ，HttpClient 会默认以 application/x-www-form-urlencoded 格式发送请求
      // 通过 contentType 告诉 HttpClient 以 JSON 格式发送  ,
      contentType: 'json',
      data: {
        name: 'xxxxxx',
        age: 21,
        addr: 'guangzhou',
      },
      // 以json格式接收， 明确告诉 HttpClient 以 JSON 格式处理返回的响应 body
      dataType: 'json',
    });

    this.ctx.body = result.data;
  }


  /**
     * fileupload
     * test curl - post - multipart/form-data
     */
  async httpupload() {

    const url = 'https://httpbin.org/post';
    const result = await this.ctx.curl(url, {
      method: 'POST', // 必须指定 method , 支持 GET、POST、PUT、DELETE、PATCH

      // contentType设置请求数据格式，默认是 undefined， HttpClient 会自动根据 data 和 content 参数自动设置。 data 是 object 的时候默认设置的是 form。支持 json 格式。
      // contentType: String

      // dataType设置响应数据格式，默认不对响应数据做任何处理，直接返回原始的 buffer 格式数据。 支持 text 和 json 两种格式。
      dataType: 'json', // 客户端以json格式解析body

      data: {
        foo: 'bar',
      },
      // 发送请求正文，如果设置了此参数，那么会直接忽略 data 参数。
      // content: String|Buffer,

      // 设置发送请求正文的可读数据流，默认是 null。 一旦设置了此参数，HttpClient 将会忽略 data 和 content。
      // stream: ReadStream,
      // stream: fs.createReadStream('/path/to/read'),

      // 设置请求头。
      // headers: Object，

      // 简单登录授权（Basic Authentication）参数，将以明文方式将登录信息以 Authorization 请求头发送出去。
      // auth: 'foo:bar',

      // 是否自动跟进 3xx 的跳转响应，默认是 false。
      // followRedirect: Boolean

      // 设置最大自动跳转次数，避免循环跳转无法终止，默认是 10 次。 此参数不宜设置过大，它只在 followRedirect=true 情况下才会生效。
      // maxRedirects: Number

      // 是否支持 gzip 响应格式，默认为 false。 开启 gzip 之后，HttpClient 将自动设置 Accept-Encoding: gzip 请求头， 并且会自动解压带 Content-Encoding: gzip 响应头的数据。
      // gzip: Boolean


      // 单文件上传
      files: __filename, // 当前脚本文件

      // 多文件上传
      // files: {
      //   file1: __filename,
      //   file2: fs.createReadStream(__filename),
      //   file3: Buffer.from('mock file content'),
      // },

      // 在请求正式发送之前，会尝试调用 beforeRequest 钩子，允许我们在这里对请求参数做最后一次修改。
      // beforeRequest: Function(options),
      beforeRequest: option => {
        // 例如 设置全局请求 id，方便日志跟踪
        options.headers['x-request-id'] = uuid.v1();
      },


    });

    this.ctx.body = result.data.files;
    // this.ctx.body = result;

  }


}

module.exports = HttpController;
